package com.taobao.demo.common.utils;

/**
 * 类描述：
 * 
 * @author xhy
 * @date 2025/10/16 18:15
 * @version 1.0.0
 */
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

@Component
public class JwtUtil {
    @Value("${jwt.secret:taobao_demo_secret}") // 密钥（与你的配置保持一致）
    private String secret;

    @Value("${jwt.user-expire:7200000}") // 普通用户过期时间（默认2小时，毫秒）
    private long userExpire;

    @Value("${jwt.admin-expire:28800000}") // 管理员过期时间（默认8小时，毫秒）
    private long adminExpire;

    /** 生成 JWT 令牌（用户ID作为载荷） */
    public String generateToken(Long userId, String role) {
        Date now = new Date();
        // 按角色选择过期时间：普通用户用userExpire，管理员用adminExpire
        long expire = "USER".equals(role) ? userExpire : adminExpire;
        Date expireTime = new Date(now.getTime() + expire);

        return Jwts.builder()
                .setSubject(userId.toString()) // 主题：用户ID（保留原有设计）
                .claim("role", role) // 额外存储角色信息（关键补充）
                .setIssuedAt(now) // 签发时间
                .setExpiration(expireTime) // 过期时间
                .signWith(SignatureAlgorithm.HS256, secret) // 签名算法（与原有一致）
                .compact();
    }

    /** 解析令牌，提取用户ID（保留原有方法） */
    public Long getUserIdFromToken(String token) {
        Claims claims = parseClaims(token);
        return Long.parseLong(claims.getSubject());
    }

    /** 新增：解析令牌，提取角色信息 */
    public String getRoleFromToken(String token) {
        Claims claims = parseClaims(token);
        return claims.get("role", String.class); // 从claim中获取角色
    }

    /** 验证令牌是否有效（保留原有逻辑，增强异常处理） */
    public boolean validateToken(String token) {
        try {
            parseClaims(token); // 解析成功即有效
            return true;
        } catch (Exception e) {
            return false; // 解析失败（过期/篡改）均返回无效
        }
    }

    /** 新增：解析令牌的claims（复用逻辑，减少重复代码） */
    private Claims parseClaims(String token) {
        return Jwts.parser()
                .setSigningKey(secret)
                .parseClaimsJws(token)
                .getBody();
    }

    /** 保留原有IP获取方法（登录日志用） */
    public static String getIp(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        if (ip != null && ip.contains(",")) {
            ip = ip.split(",")[0].trim();
        }
        return ip;
    }
}
